package es.urjc.ldm.carrodecompra;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;


public class CarroDeCompra {

	private HashMap<String, ListaArticulos> shoppingTrolley;
	private int totalProduct;
	private double totalPriceProduct;
	private int distinctProductTotal;
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public CarroDeCompra(){
		shoppingTrolley = new HashMap<String, ListaArticulos>();
		this.totalPriceProduct = 0;
		this.totalProduct = 0;
		this.distinctProductTotal = 0;
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public void addProduct(InfoArticulos prod){
		String cod = Long.toString(prod.getCod());
		ListaArticulos products;
		
		// Comprueba que ya exista articulos en la cesta
		if(shoppingTrolley.containsKey(cod)){
			 
			products = shoppingTrolley.get(cod);
			
			// Resta el precio anterior
			totalPriceProduct -= products.getTotalPrice();
					
		}else{
			products = new ListaArticulos();
			this.distinctProductTotal ++;
		}
		
		products.addProduct(prod);
		shoppingTrolley.put(cod, products);
				
				
		// Incrementa el contador de productos cargados en la cesta
		totalProduct ++;
		
		// Incrementa el nuevo precio de la cesta
		totalPriceProduct += products.getTotalPrice();
					
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public void setProduct(InfoArticulos prod, int numProd){
		String cod = Long.toString(prod.getCod());
		ListaArticulos products;
				
		// Comprueba que ya exista articulos en la cesta
		if(shoppingTrolley.containsKey(cod)){
			 
			products = shoppingTrolley.get(cod);
						
			if (numProd == 0){
				removeProduct(prod);
			}else {
				
				// Incrementa el contador de productos cargados en la cesta
				totalProduct -= products.getNumUnits();
				
				// Incrementa el nuevo precio de la cesta
				totalPriceProduct -= products.getTotalPrice();
				
				products.setProduct(numProd);
				
				// Incrementa el contador de productos cargados en la cesta
				totalProduct += products.getNumUnits();
				
				// Incrementa el nuevo precio de la cesta
				totalPriceProduct += products.getTotalPrice();
			}
		}			
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public void removeProduct(InfoArticulos prod){
		String cod = Long.toString(prod.getCod());
		
		ListaArticulos products = shoppingTrolley.get(cod);
		
		// Decrementa el contador de productos cargados en la cesta
		totalProduct -= products.getNumUnits();
				
		// Incrementa el nuevo precio de la cesta
		totalPriceProduct -= products.getTotalPrice();
				
		this.distinctProductTotal --;
				
		shoppingTrolley.remove(cod);
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */	
	public ListaArticulos getItem (int position){
		List<String> keys = new ArrayList<String>(shoppingTrolley.keySet());
		Collections.sort(keys);
		return shoppingTrolley.get(keys.get(position));
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public int getCount(){
		return totalProduct;
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public double getTotalPrice(){
		return totalPriceProduct;
	}
	
	/** Constructor de la clase ListProduct, inicializa el contador de articulos y su precio
	 *
	 * @author manuelgblanco
	 * @version 1.0z 1 Abril, 2013.
	 * @param
	 * @return 
	 */
	public int getDistinctProductTotal() {
		return distinctProductTotal;
	}
}
